astr = '-'
bstr = astr.join('hello world')  # 序列的连接要保证衔接项和括号里的容器元素都是字符串，当衔接项是''时，代表将括号内的对象的每个元素
# 无缝相连，这时''代表空字符串，而' '代表1空格字符串，使用它join将导致括号里每个元素以空格相连。
# 注意：空白包含有：空格，\n，\t  也即空格属于空白，空白不等同于空格
# 连接的输出结果是一个字符串
print(bstr)
cstr = 'python      go java c++'
dstr = cstr.split('o')  # 拆分的作用类似于剪刀，拆分基于的对象将被除去，括号为空时，拆分基于的对象是空白
# 注意与连接不同，这里拆分基于的对象不能是''，也即不能以空字符串进行分隔
print(dstr)  # 输出的成了列表
print(cstr.find('g'))
print(cstr.index('o'))  # 输出的索引是首次出现的位置，且只会找搜索对象的首字母。
num = cstr.find('o')
print(cstr.find('o', num + 1))  # 若想输出搜索对象第二次出现的索引，可以在第一次出现的位置+1开始查找。
print(cstr.find('x'))
# print(cstr.index('x'))  # 两种方式都可以在字符串中查找字符，若真的存在，输出索引，若不存在，find输出-1，index报错。
estr = 'demo_xx.py'
print(estr.startswith('demo'))
print(estr.endswith('py'))
fstr = 'hello,world!'
print(fstr.replace('world', 'python'))  # 若替换对象找不到（如打错字），则没有影响，相当于无效代码，不会报错。
# 默认全部替换，若有只替换首个旧对象的需求，可str.replace('old_str', 'new_str', 1)操作，
# 一般不考虑存在多个旧对象时替换除首个之外的某个这种情况，可忽略。
print(fstr)  # 可以看出字符串属于不可变化对象，替换操作（包括其它针对源字符串的操作）并不会影响源字符串。
# 字符串的定义：
str1 = 'hello'  # 单引号定义
str2 = "hello"  # 双引号定义
str3 = '''hello'''  # 三单引号定义，当赋值于变量时，它是字符串，不是注释项
str4 = """hello"""  # 三双引号定义，当赋值于变量时，它是字符串，不是注释项
str5 = "I'm 小明"  # 字符内容内部含有单引号时，使用双引号能将其定义成字符串
str6 = '我是"小明"'  # 字符内容内部或外部含有双引号时，使用单引号能将其定义成字符串
str7 = '"小明"是我'  # 字符内容内部或外部含有双引号时，使用单引号能将其定义成字符串
str8 = "'hello'"  # 字符内容外部含有单引号时，使用双引号能将其定义成字符串
str9 = '"是他干的！"'  # 字符内容外部含有双引号时，使用单引号能将其定义成字符串
str10 = ''''That's it!',"Li" said.'''  # 单双都存在于字符中时，使用三单或三双引号可将其定义成字符串
str11 = ''''That's it!',"Li" said."'''
str12 = """"That's it!',"Li" said.'"""
str13 = '''"That's it!',"Li" said."'''
str14 = 'I\'m 小明'  # \是转义字符，\' -->> '  \" -->> "  也即使用转义字符对原字符内的'进行转义后，
# 就可以使用单引号将其定义为字符串了，输出将隐藏\，并把转义后的单引号原位输出
str15 = 'I\\\'m 小明'  # 若在上面的需求基础上，还需要在单引号前输出\，则需要在\前加两个\
str16 = r'I\\\'m 小明'  # 在使用了转义的字符串前加个r，会将所含的所有转义无效化，也即\变得只是个普通字符，输出将正常显示
